home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: MegaDisc
/
MegaDisc 02 (1987)(MegaDisc Digital Publishing)(AU)[WB].zip
/
MegaDisc 02 (1987)(MegaDisc Digital Publishing)(AU)[WB].adf
/
PROGRAMS
/
jigsaw5
(
.txt
)
< prev
next >
Wrap
AmigaBASIC Source Code
|
1987-04-21
|
6KB
|
277 lines
' *** COMPUTE!'S AMAZING JIGSAW PROGRAM ***
DEFINT a-z
DEFSNG colrs
DEF FNxyfmrc(cr,w)=(cr-1)*w
DEF FNrcfmxy(xy,w)=INT((xy+w)/w)
false=0:true=-1
ncols.pzl=5:nrows.pzl=4
xmin.pzl=0:xmax.pzl=149:ymin.pzl=0:Move.piece=99
xwidth=(xmax.pzl-xmin.pzl+1)/ncols.pzl
ywidth=(Move.piece-ymin.pzl+1)/nrows.pzl
getsize=3+INT((16+xwidth-1)/16)*ywidth*5
rmin=1:rmax=7:cmin=1:cmax=10
xmin=FNxyfmrc(cmin,xwidth)
xmax=FNxyfmrc(cmax,xwidth)
ymin=FNxyfmrc(rmin,ywidth)
ymax=FNxyfmrc(rmax,ywidth)
d=5:ncolrs=2^d-1:colrmin=2:colrmax=ncolrs-23
vmin=1:vmax=3
DIM colrs(ncolrs,3),a(getsize,1),b(getsize)
DIM pcol(ncols.pzl-1,nrows.pzl-1), prow(ncols.pzl-1,nrows.pzl-1)
DIM cols(ncols.pzl*nrows.pzl-1), rows(ncols.pzl*nrows.pzl-1)
DIM s$(ncols.pzl-1,nrows.pzl-1)
PALETTE 0,0,0.3,0.6
PALETTE 1,1,1,0
s1$=STRING$(26,0)
POKE SADD(s1$)+11,d
POKE SADD(s1$)+15,xwidth
POKE SADD(s1$)+19,ywidth
POKE SADD(s1$)+21,24
POKE SADD(s1$)+23,2^d-1
RESTORE Nu.Colors
FOR i=0 TO ncolrs-1 'get new palette colours from DATA
FOR j=0 TO 2
READ colrs(i,j)
NEXT j
PALETTE i, colrs(i,0), colrs(i,1), colrs(i,2)
NEXT i
RESTORE Cols.Rows
FOR i=0 TO ncols.pzl*nrows.pzl-1
READ cols(i):READ rows(i)
NEXT
SCREEN 1,320,200,d,1
WINDOW 2,"JIGSAW",,28,1
Restart:
CLS:RANDOMIZE TIMER:moves=0
p$="Press space bar to stop puzzle":LOCATE 23,20-INT(LEN(p$)/2):PRINT p$;
WINDOW 3,"JIGSAW",(80,70)-(229,169),16,1
PAINT (10,10),2
GOSUB Make.Puzzle
WINDOW OUTPUT 2
LOCATE 23,20-INT(LEN(p$)/2):PRINT STRING$(LEN(p$)," ");
'Make Bob strings and place pieces on the screen
clast=ncols.pzl-1:rlast=nrows.pzl-1
' *** This was the start of the listing ***
FOR irow=0 TO rlast
FOR icol=0 TO clast
WINDOW OUTPUT 3
x=FNxyfmrc(icol+1,xwidth):y=FNxyfmrc(irow+1,ywidth)
GET (x,y)-(x+xwidth-1,y+ywidth-1),a(0,0)
s$(icol,irow)=""
ilast=getsize-1
FOR i=3 TO ilast:s$(icol,irow)=s$(icol,irow)+MKI$(a(i,0)):NEXT
WINDOW OUTPUT 2
i=icol+ncols.pzl*irow
x=FNxyfmrc(cols(i),xwidth):y=FNxyfmrc(rows(i),ywidth)
PUT (x,y),a(0,0)
pcol(icol,irow)=cols(i):prow(icol,irow)=rows(i)
NEXT
NEXT
WINDOW 2
' Shuffle the pieces
FOR i=0 TO 20
pick.rc:
FOR j=1 TO 2
col(j)=INT(ncols.pzl*RND):row(j)=INT(nrows.pzl*RND)
NEXT j
IF col(1)=col(2) AND row(1)=row(2) THEN GOTO pick.rc
FOR j=1 TO 2
x(j)=FNxyfmrc(pcol(col(j),row(j)),xwidth)
y(j)=FNxyfmrc(prow(col(j),row(j)),ywidth)
GET (x(j),y(j))-(x(j)+xwidth-1,y(j)+ywidth-1),a(0,j-1)
LINE (x(j),y(j))-(x(j)+xwidth-1,y(j)+ywidth-1),0,bf
NEXT j
PUT (x(1),y(1)),a(0,1):PUT (x(2),y(2)),a(0,0)
SWAP pcol(col(1),row(1)),pcol(col(2),row(2))
SWAP prow(col(1),row(1)),prow(col(2),row(2))
NEXT
'
' Main loop
'
t!=TIMER:ON TIMER (1) GOSUB Show.Time:TIMER ON
done=false:selection.made=false
GOSUB Beap
WHILE NOT done
IF MOUSE(0)=-1 THEN
Select.Piece:
x=MOUSE(5):y=MOUSE(6) 'get x & y of mouse
GOSUB Fit2Scn 'see if on screen
col=FNrcfmxy(x,xwidth):row=FNrcfmxy(y,ywidth)
GOSUB WhatsThere
IF piece THEN
col.piece=cp:row.piece=rp
pcol(col.piece,row.piece)=-1
prow(col.piece,row.piece)=-1
GOSUB Beap
xp=FNxyfmrc(col,xwidth):yp=FNxyfmrc(row,ywidth)
xdif=xp-x:ydif=yp-y
GET (xp,yp)-(xp+xwidth-1,yp+ywidth-1),a(0,0)
LINE (xp,yp)-(xp+xwidth-1,yp+ywidth-1),0,bf
OBJECT.SHAPE 1,s1$+s$(col.piece,row.piece)
OBJECT.X 1,xp:OBJECT.Y 1,yp
OBJECT.ON 1
selection.made=true
END IF
END IF '(mouse)
WHILE selection.made
WHILE MOUSE(0)=-1
x=MOUSE(5):y=MOUSE(6)
GOSUB Fit2Scn
IF x<>xp-xdif OR y<>yp-ydif THEN
xp=x+xdif:yp=y+ydif
OBJECT.X 1,xp:OBJECT.Y 1,yp
END IF
WEND
GOSUB Fit2Scn
col=FNrcfmxy(x,xwidth)
row=FNrcfmxy(y,ywidth)
GOSUB WhatsThere
IF NOT piece THEN
x=FNxyfmrc(col,xwidth)
y=FNxyfmrc(row,ywidth)
OBJECT.OFF 1:PUT (x,y),a(0,0)
selection.made=false
pcol(col.piece,row.piece)=col
prow(col.piece,row.piece)=row
GOSUB Beap
moves=moves+1:LOCATE 23,13:PRINT"Moves:";moves;
r0=prow(0,0):c0=pcol(0,0):count=0
FOR r=0 TO nrows.pzl-1
FOR c=0 TO ncols.pzl-1
IF (prow(c,r)-r0)=r THEN
IF (pcol(c,r)-c0)=c THEN count=count+1
END IF
NEXT c,r
IF count=nrows.pzl*ncols.pzl THEN done =true
END IF '(not piece)
WEND '(selection)
WEND '(done)
TIMER OFF
FOR i=0 TO 10:GOSUB Beap:NEXT
p$="Again (Y/N)?"
COLOR 1,o:LOCATE 23,25:PRINT p$;
p$="":FOR i=0 TO 1000:NEXT:WHILE p$="":p$=INKEY$:WEND
IF p$="y" OR p$="Y" THEN GOTO Restart
SCREEN CLOSE 1
END
Beap:
SOUND 800,1,100,0:SOUND 1000,1,100,0
RETURN
Fit2Scn:
IF x<xmin THEN x=xmin
IF x>xmax THEN x=xmax
IF y<ymin THEN y=ymin
IF y>ymax THEN y=ymax
RETURN
WhatsThere:
piece=false:clast=ncols.pzl-1:rlast=nrows.pzl-1
FOR c=0 TO clast
FOR r=0 TO rlast
IF pcol(c,r)=col THEN
IF prow(c,r)=row THEN piece=true:cp=c:rp=r:RETURN
END IF
NEXT
NEXT
RETURN
Make.Puzzle:
FOR i=0 TO 1
x(i)=xmax.pzl*RND:y(i)=Move.piece*RND
v:
vx(i)=2*vmax*RND-vmax:vy(i)=2*vmax*RND-vmax
IF vx(i)=0 OR vy(i)=0 THEN GOTO v
NEXT
colr=colrmin
WHILE INKEY$=""
FOR i= 0 TO 1
x(i)=x(i)+vx(i)
y(i)=y(i)+vy(i)
IF x(i)<=xmin.pzl OR x(i)>=xmax.pzl THEN
vx(i)=-SGN(vx(i))*(RND(vmax)+vmin)
END IF
IF y(i)<=ymin.pzl OR y(i)>=Move.piece THEN
vy(i)=-SGN(vy(i))*(RND(vmax)+vmin)
END IF
NEXT
colr=colr+1:IF colr>ncolrs-1 THEN colr=colrmin
LINE (x(0),y(0))-(x(1),y(1)),colr
WEND
RETURN
Show.Time:
T2!=TIMER
LOCATE 23,1:PRINT "Time:";CINT(T2!-t!);
GOSUB Colr.Shift
RETURN
Colr.Shift:
FOR i=0 TO colrmax
IF i=colrmax THEN k=0 :ELSE k=i+1
FOR j=0 TO 2
colrs(i,j) = colrs(k,j)
NEXT j
PALETTE i, colrs(i,0), colrs(i,1), colrs(i,2)
NEXT
RETURN
Nu.Colors:
DATA .00, .30, .60
DATA .99, .60, .03
DATA .59, .99, .03
DATA .03, .55, .11
DATA .03, .99, .81
DATA .03, .51, .99
DATA .50, .03, .50
DATA .89, .03, .99
DATA .99, .03, .40
DATA .25, .50, .50
DATA .60, .00, .00
DATA .45, .30, .00
DATA .99, .99, .00
DATA .50, .00, .25
DATA .00, .25, .25
DATA .55, .00, .15
DATA .25, .25, .00
DATA .45, .00, .00
DATA .00, .30, .00
DATA .75, .45, .00
DATA .25, .25, .25
DATA .00, .99, .00
DATA .50, .25, .25
DATA .99, .25, .00
DATA .50, .50, .25
DATA .99, .00, .99
DATA .55, .15, .40
DATA .25, .00, .25
DATA .70, .25, .00
DATA .50, .50, .50
DATA .75, .35, .30
DATA .30, .20, .00
Cols.Rows:
DATA 1,1, 2,2, 1,3, 2,4, 1,5, 2,6, 1,7
DATA 9,1, 10,2, 9,3, 10,4, 9,5, 10,6, 9,7
DATA 3,1, 4,2, 5,1, 6,2, 7,1, 8,2